/**
 * 机勘院DeepSeek系统 - 智能会话页面JavaScript
 */

// 全局变量
let darkMode = localStorage.getItem('darkMode') === 'true';
let currentConversationId = null;

$(document).ready(function() {
    // 初始化页面
    initChatPage();
    
    // 初始化暗色模式
    initDarkMode();
    
    // 绑定事件
    bindEvents();
    
    // 自动调整输入框高度
    autoResizeTextarea();
});

/**
 * 初始化聊天页面
 */
function initChatPage() {
    // 初始化工具提示
    initTooltips();
    
    // 初始化侧边栏状态
    initSidebar();
    
    // 加载最近会话
    loadRecentConversations();
}

/**
 * 初始化工具提示
 */
function initTooltips() {
    const tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
    tooltipTriggerList.map(function (tooltipTriggerEl) {
        return new bootstrap.Tooltip(tooltipTriggerEl);
    });
}

/**
 * 初始化侧边栏
 */
function initSidebar() {
    // 移动端侧边栏切换
    $('#sidebarToggle').on('click', function() {
        $('.deepseek-sidebar').toggleClass('show');
    });
    
    // 点击主内容区域时关闭侧边栏
    $('.deepseek-main').on('click', function() {
        if ($('.deepseek-sidebar').hasClass('show')) {
            $('.deepseek-sidebar').removeClass('show');
        }
    });
}

/**
 * 初始化暗色模式
 */
function initDarkMode() {
    if (darkMode) {
        $('body').addClass('dark-mode');
        $('#toggleDarkMode i').removeClass('fa-moon').addClass('fa-sun');
    }
    
    $('#toggleDarkMode').on('click', function() {
        darkMode = !darkMode;
        $('body').toggleClass('dark-mode');
        $(this).find('i').toggleClass('fa-moon fa-sun');
        localStorage.setItem('darkMode', darkMode);
    });
}

/**
 * 绑定事件处理
 */
function bindEvents() {
    // 发送消息
    $('#sendMessage').on('click', sendMessage);
    
    // 按下Enter键发送消息
    $('#messageInput').on('keydown', function(e) {
        if (e.key === 'Enter' && !e.shiftKey) {
            e.preventDefault();
            sendMessage();
        }
    });
    
    // 文件上传按钮
    $('.chat-toolbar button[title="上传文件"]').on('click', function() {
        $('#uploadModal').modal('show');
    });
    
    // 确认上传
    $('#confirmUpload').on('click', uploadFiles);
    
    // 清空会话
    $('.chat-toolbar button[title="清空会话"]').on('click', clearConversation);
    
    // 录音按钮
    $('.chat-toolbar button[title="录音"]').on('click', toggleRecording);
    
    // 导航项点击
    $('.deepseek-nav-item').on('click', function(e) {
        e.preventDefault();
        
        // 更新活动状态
        $('.deepseek-nav-item').removeClass('active');
        $(this).addClass('active');
        
        // 加载对应内容
        const tabId = $(this).data('tab');
        loadTabContent(tabId);
    });
}

/**
 * 自动调整文本框高度
 */
function autoResizeTextarea() {
    $('#messageInput').on('input', function() {
        this.style.height = 'auto';
        this.style.height = (this.scrollHeight) + 'px';
    });
}

/**
 * 发送消息
 */
function sendMessage() {
    const messageInput = $('#message-input');
    const message = messageInput.val().trim();
    
    if (message === '') return;
    
    // 将用户消息添加到聊天区域
    appendMessage('user', message);
    
    // 清空输入框并重置高度
    messageInput.val('').css('height', 'auto');
    
    // 显示AI正在输入的提示
    showTypingIndicator();
    
    // 获取当前聊天历史
    const chatHistory = getChatHistory();
    
    // 使用DeepSeek API发送消息
    deepseekAPI.chat(chatHistory, {
        model: 'deepseek-chat',
        temperature: 0.7,
        maxTokens: 2048,
        stream: true
    })
    .then(response => {
        // 移除"正在输入"提示
        removeTypingIndicator();
        
        if (response.async) {
            // 处理流式响应
            handleStreamResponse(response);
        } else {
            // 处理非流式响应
            handleStandardResponse(response);
        }
    })
    .catch(error => {
        // 移除"正在输入"提示
        removeTypingIndicator();
        
        // 显示错误消息
        appendMessage('assistant', `抱歉，我遇到了一些问题：${error.message}`);
        console.error('聊天请求失败:', error);
    });
    
    // 滚动到底部
    scrollToBottom();
}

/**
 * 获取当前聊天历史记录，用于发送给API
 */
function getChatHistory() {
    const messages = [];
    
    // 添加系统消息
    messages.push({
        role: 'system',
        content: '您是由机勘院研发的DeepSeek AI助手，专注于道路勘察相关问题的解答。请根据用户提供的信息，给出准确、专业的回复。'
    });
    
    // 从DOM中提取聊天消息
    $('.chat-message').each(function() {
        const role = $(this).hasClass('user-message') ? 'user' : 'assistant';
        const content = $(this).find('.message-content').text();
        
        // 只添加有内容的消息
        if (content.trim()) {
            messages.push({ role, content });
        }
    });
    
    return messages;
}

/**
 * 处理流式响应
 */
function handleStreamResponse(response) {
    // 创建一个新的消息容器
    const messageId = `msg-${Date.now()}`;
    const messageHtml = `
        <div class="chat-message ai-message">
            <div class="message-avatar">
                <i class="fas fa-robot"></i>
            </div>
            <div class="message-content" id="${messageId}"></div>
        </div>
    `;
    $('#chat-history').append(messageHtml);
    
    // 开始处理流式输出
    processStreamOutput(response.data, messageId);
    
    // 滚动到底部
    scrollToBottom();
}

/**
 * 处理非流式响应
 */
function handleStandardResponse(response) {
    const message = response.choices[0].message.content;
    appendMessage('assistant', message);
    
    // 滚动到底部
    scrollToBottom();
}

/**
 * 处理流式输出
 */
function processStreamOutput(controller, elementId) {
    // 初始化
    let content = '';
    const element = $(`#${elementId}`);
    
    // 递归处理每个分块
    function processNextChunk() {
        const { done, value } = controller.next();
        
        if (done) {
            return; // 完成处理
        }
        
        if (value) {
            // 更新UI
            if (value.choices[0].delta.content) {
                content += value.choices[0].delta.content;
                element.html(formatMessage(content));
                
                // 滚动到底部
                scrollToBottom();
            }
            
            // 等待一小段时间后处理下一个分块，模拟打字效果
            setTimeout(processNextChunk, 10);
        } else {
            setTimeout(processNextChunk, 10);
        }
    }
    
    // 开始处理
    processNextChunk();
}

/**
 * 添加消息到聊天记录
 * @param {string} type - 消息类型（user/ai）
 * @param {string} content - 消息内容
 */
function appendMessage(type, content) {
    const time = new Date().toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit' });
    const avatar = type === 'user' ? '<i class="fas fa-user"></i>' : '<i class="fas fa-robot"></i>';
    
    const messageHtml = `
        <div class="chat-message ${type}-message">
            <div class="message-avatar">
                ${avatar}
            </div>
            <div class="message-content">
                <div class="message-text">
                    ${formatMessage(content)}
                </div>
                <div class="message-time">${time}</div>
            </div>
        </div>
    `;
    
    $('#chatHistory').append(messageHtml);
    scrollToBottom();
}

/**
 * 格式化消息内容
 * @param {string} content - 原始消息内容
 * @returns {string} 格式化后的HTML
 */
function formatMessage(content) {
    // 将URL转换为可点击的链接
    content = content.replace(/(https?:\/\/[^\s]+)/g, '<a href="$1" target="_blank">$1</a>');
    
    // 将换行符转换为<br>标签
    content = content.replace(/\n/g, '<br>');
    
    return content;
}

/**
 * 显示AI正在输入状态
 */
function showTypingIndicator() {
    const typingHtml = `
        <div class="chat-message ai-message typing-indicator">
            <div class="message-avatar">
                <i class="fas fa-robot"></i>
            </div>
            <div class="message-content">
                <div class="typing-dots">
                    <span></span>
                    <span></span>
                    <span></span>
                </div>
            </div>
        </div>
    `;
    
    $('#chatHistory').append(typingHtml);
    scrollToBottom();
}

/**
 * 移除AI正在输入状态指示器
 */
function removeTypingIndicator() {
    $('.typing-indicator').remove();
}

/**
 * 滚动到聊天记录底部
 */
function scrollToBottom() {
    const chatHistory = $('#chatHistory');
    chatHistory.scrollTop(chatHistory[0].scrollHeight);
}

/**
 * 上传文件
 */
function uploadFiles() {
    const files = $('#fileInput')[0].files;
    if (files.length === 0) return;
    
    // 在实际应用中，这里应该调用API上传文件
    const formData = new FormData();
    for (let i = 0; i < files.length; i++) {
        formData.append('files[]', files[i]);
    }
    
    // 显示上传进度
    showUploadProgress();
    
    // 模拟上传过程
    setTimeout(function() {
        // 上传完成
        $('#uploadModal').modal('hide');
        
        // 清空文件输入
        $('#fileInput').val('');
        
        // 在聊天记录中显示文件信息
        const fileList = Array.from(files).map(file => file.name).join('、');
        appendMessage('user', `上传文件：${fileList}`);
        
        // 模拟AI响应
        setTimeout(function() {
            appendMessage('ai', '文件上传成功！我已经开始分析文件内容，请稍候...');
        }, 500);
    }, 1500);
}

/**
 * 显示上传进度
 */
function showUploadProgress() {
    const progressHtml = `
        <div class="progress mt-3">
            <div class="progress-bar progress-bar-striped progress-bar-animated" style="width: 0%"></div>
        </div>
    `;
    
    $('.upload-preview').html(progressHtml);
    
    // 模拟进度更新
    let progress = 0;
    const interval = setInterval(function() {
        progress += 10;
        $('.progress-bar').css('width', progress + '%');
        
        if (progress >= 100) {
            clearInterval(interval);
            $('.progress-bar').removeClass('progress-bar-animated');
        }
    }, 200);
}

/**
 * 清空会话
 */
function clearConversation() {
    if (confirm('确定要清空当前会话吗？此操作不可恢复。')) {
        // 保留欢迎消息
        const welcomeMessage = $('#chatHistory .chat-message').first();
        $('#chatHistory').empty().append(welcomeMessage);
        
        // 重置会话ID
        currentConversationId = null;
    }
}

/**
 * 切换录音状态
 */
function toggleRecording() {
    const $button = $('.chat-toolbar button[title="录音"]');
    const isRecording = $button.hasClass('active');
    
    if (isRecording) {
        stopRecording();
        $button.removeClass('active btn-danger').addClass('btn-outline-secondary');
    } else {
        startRecording();
        $button.removeClass('btn-outline-secondary').addClass('active btn-danger');
    }
}

/**
 * 开始录音
 */
function startRecording() {
    // 在实际应用中，这里应该调用录音API
    console.log('开始录音');
}

/**
 * 停止录音
 */
function stopRecording() {
    // 在实际应用中，这里应该停止录音并处理录音文件
    console.log('停止录音');
}

/**
 * 插入建议文本
 * @param {HTMLElement} element - 建议标签元素
 */
function insertSuggestion(element) {
    const text = $(element).text();
    const input = $('#messageInput');
    input.val(text).focus();
}

/**
 * 加载最近会话
 */
function loadRecentConversations() {
    // 在实际应用中，这里应该从服务器获取最近会话列表
    const conversations = [
        {
            id: 1,
            title: '道路勘察方案讨论',
            lastMessage: '请分析这份地质报告的关键发现...',
            time: '2025-03-02 14:30'
        },
        {
            id: 2,
            title: '工程造价估算',
            lastMessage: '根据现有数据，估算该项目的总成本...',
            time: '2025-03-01 16:45'
        }
    ];
    
    // 更新侧边栏会话列表
    updateConversationList(conversations);
}

/**
 * 更新会话列表
 * @param {Array} conversations - 会话列表数据
 */
function updateConversationList(conversations) {
    const listHtml = conversations.map(conv => `
        <div class="conversation-item" data-id="${conv.id}">
            <div class="conversation-title">${conv.title}</div>
            <div class="conversation-preview">${conv.lastMessage}</div>
            <div class="conversation-time">${conv.time}</div>
        </div>
    `).join('');
    
    // 在实际应用中，这里应该更新侧边栏的会话列表
    console.log('更新会话列表:', listHtml);
}

/**
 * 加载选项卡内容
 * @param {string} tabId - 选项卡ID
 */
function loadTabContent(tabId) {
    switch(tabId) {
        case 'recent-tab':
            loadRecentConversations();
            break;
        case 'favorites-tab':
            loadFavoriteConversations();
            break;
        case 'templates-tab':
            loadConversationTemplates();
            break;
    }
}

/**
 * 加载收藏的会话
 */
function loadFavoriteConversations() {
    // 在实际应用中，这里应该从服务器获取收藏的会话
    console.log('加载收藏会话');
}

/**
 * 加载会话模板
 */
function loadConversationTemplates() {
    // 在实际应用中，这里应该从服务器获取会话模板
    console.log('加载会话模板');
} 